package io.babystar.common.utils;

import java.io.*;

/**
 * @author ipodao@qq.com
 * @date 2019/9/4 16:05
 */
public class ExportFile {
    private static final String EXPORT_PATH = "/Users/wanghucheng/Downloads/";

    public static void main(String[] args) {
        ExportFile apk = new ExportFile();
        String infilePath = EXPORT_PATH + "up.bin";
        String outfilePath = EXPORT_PATH + "hex.txt";
        apk.fileToHex(infilePath, outfilePath);
        //hex val
        //String val = "";
        //apk.hexToFile(val, "a.zip");
    }

    /**
     * 文件转成十六进制
     *
     * @param infilePath  转为16进制的文件
     * @param outfilePath 16进制 txt
     */
    public void fileToHex(String infilePath, String outfilePath) {
        try {
            StringBuffer sb = new StringBuffer();
            FileInputStream fis = new FileInputStream(infilePath);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();

            byte[] buffer = new byte[1024];
            int read = 1024;
            int readSize = 1024;
            while (read == readSize) {
                read = fis.read(buffer, 0, readSize);
                bos.write(buffer, 0, read);
            }
            byte[] result = bos.toByteArray();
            // 字节数组转成十六进制
            String str = byte2HexStr(result);
            System.out.println("HexStr：" + str);
            System.out.println("size:"+str.length());
            System.out.println("size:"+str.length()/2/128);
            /*
             * 将十六进制串保存到txt文件中
             */
            PrintWriter pw = new PrintWriter(new FileWriter(outfilePath));
            pw.println(str);
            pw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 十六进制转成文件
     *
     * @param hex
     * @param filePath
     */
    public static void hexToFile(String hex, String filePath) {
        StringBuilder sb = new StringBuilder();
        sb.append(hex);
        saveToFile(sb.toString().toUpperCase(), EXPORT_PATH + filePath);
    }

    /**
     * hex 转为文件
     *
     * @param src
     * @param output
     */
    public static void saveToFile(String src, String output) {
        if (src == null || src.length() == 0) {
            return;
        }
        try {
            FileOutputStream out = new FileOutputStream(new File(output));
            byte[] bytes = src.getBytes();
            for (int i = 0; i < bytes.length; i += 2) {
                out.write(charToInt(bytes[i]) * 16 + charToInt(bytes[i + 1]));
            }
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static int charToInt(byte ch) {
        int val = 0;
        if (ch >= 0x30 && ch <= 0x39) {
            val = ch - 0x30;
        } else if (ch >= 0x41 && ch <= 0x46) {
            val = ch - 0x41 + 10;
        }
        return val;
    }

    /*
     * 实现字节数组向十六进制的转换方法一
     */
    public static String byte2HexStr(byte[] b) {
        String hs = "";
        String stmp = "";
        for (int n = 0; n < b.length; n++) {
            stmp = (Integer.toHexString(b[n] & 0XFF));
            if (stmp.length() == 1) {
                hs = hs + "0" + stmp;
            } else {
                hs = hs + stmp;
            }
        }
        return hs.toUpperCase();
    }
}


